백준 6359번 - 만취한 상범 파이썬(Python) 풀이

* 백준 6359번 - 만취한 상범 파이썬(Python) 풀이

문제 출처 : 백준 알고리즘 6359번 문제
난이도 별점 : ★★ (Easy)

* 문제

서강대학교 곤자가 기숙사의 지하에는 n개의 방이 일렬로 늘어선 감옥이 있다. 각 방에는 벌점을 많이 받은 학생들이 구금되어 있다.
그러던 어느 날, 감옥 간수인 상범이는 지루한 나머지 정신나간 게임을 하기로 결정했다. 게임의 첫 번째 라운드에서 상범이는 위스키를 한 잔 들이키고, 달려가며 감옥을 한 개씩 모두 연다. 그 다음 라운드에서는 2, 4, 6, … 번 방을 다시 잠그고, 세 번째 라운드에서는 3, 6, 9, … 번 방이 열려있으면 잠그고, 잠겨있다면 연다. 같은 방식으로 n번의 라운드를 진행한 이후, 상범이는 위스키의 마지막 병을 마시고 쓰러져 잠든다.
구금되어있는 몇 명(어쩌면 0명)의 학생들은 자신의 방을 잠그지 않은 채 상범이가 쓰러져버렸단 것을 깨닫고 즉시 도망친다.
방의 개수가 주어졌을 때, 몇 명의 학생들이 도주할 수 있는지 알아보자.

* 입력

입력의 첫 번째 줄에는 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄에 한 개씩 방의 개수 n(5≤n≤100)이 주어진다.

* 출력

한 줄에 한 개씩 각 테스트 케이스의 답, 즉 몇 명이 탈출할 수 있는지를 출력한다.

  • 예제 입력 1
1
2
3
2
5
100
  • 예제 출력 1
1
2
2
1

* 내가 짠 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
nlist = []
s = int(input())
for ss in range(s):
ss = int(input())
nlist.append(ss)

def Sangbeom(nlist):
for n in nlist:
list = [j for j in range(1, int(n)+1)]
for i in range(2, int(n)+1):
for j in range(1, int(n)+1):
if i*j > int(n):
break
elif i*j in list:
list.remove(i*j)
else:
list.append(i*j)
print(len(list))

Sangbeom(nlist)

* 풀이

문제를 고른 이유는 단순히 문제 제목에 내 이름이 들어가기 때문이다. 스터디원들과 협의해서 쉬운 난이도 문제로 낙점했다. 푸는데 걸린 시간은 입력 양식 맞추는데까지 약 1시간 반 정도.

image

갤럭시 탭 사서 이런데 쓰고 있다니.. 슬프당..

n=5라고 설정한다면, 술 한잔 걸친 상범은 5번에 걸쳐 모든 감옥의 방을 쭉 돈다.

1st : 감옥을 돌면서 모든 방을 연다.

  • 1부터 1씩 증가하면서 닫힌 감옥을 모두 연 것.

2nd : 2의 배수 방을 돈다.

  • 2, 4번이 열려 있으니깐 닫아준다.

3rd : 3의 배수 방을 돈다.

  • 3번이 열려 있으니깐 닫아준다.

4th : 4의 배수 방을 돈다.

  • 4번 방은 이미 닫혀있으니 다시 열어준다.

5th : 5의 배수 방을 돈다.

  • 5번이 열려 있으니깐 닫아준다.

6번째 : 방이 없음. 종료.

n번째까지 차있는 리스트(ex: n=5라면 [1, 2, 3, 4, 5])를 만들어 i번째에 문이 닫히면 remove로 지워주고, 문이 열리면 append로 다시 넣어준다.
마지막 for문이 돌아갔을 때, 열려있는 방들은 리스트 안에 들어가 있다. len 명령어로 숫자를 뽑아주면 된다.

딱 처음 생각만큼 쉬운 문제였다. 나 같은 초보자들에게 추천할만한 난이도의 문제!